function Foo(name, age) {
    this.name = name;
    this.age = age;
    // return {
    //     name: 'dd'
    // }
    // return ()=>{console.log('-------')}
}

Foo.prototype.sayName = function () {
    console.log(this.name);
};

const foo = new Foo('abc', 18);
console.log(foo);
// foo.sayName();

function newClass(func, ...args) {
    // 第一步 创建新对象
     let obj= {};
     // 第二步 空对象的_proto_指向了构造函数的prototype成员对象
     obj.__proto__ = func.prototype;//
     // 一二步合并就相当于 let obj=Object.create(func.prototype)
 
     // 第三步 使用apply调用构造器函数，属性和方法被添加到 this 引用的对象中
     let result = func.apply(obj, args);
     if (result && (typeof result === "object" || typeof result === "function")) {
       // 如果构造函数执行的结果返回的是一个对象，那么返回这个对象
       return result;
     }
     // 如果构造函数返回的不是一个对象，返回创建的新对象
     return obj;
 }
 
 const a = newClass(Foo, 'abc', 18);
 console.log(a);
//  a.sayName();